home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / recent2 / manmaker12.lha / ManMaker / main.c < prev    next >
C/C++ Source or Header  |  1997-06-10  |  4KB  |  184 lines

  1.  
  2. /* main.c
  3.  *
  4.  * Create man pages from autodocs
  5.  * by Mark Papadakis, markp@palamida.math.uch.r
  6.  * http://palamida.math.uch.gr/markp
  7.  *
  8.  * -- Changes --
  9.  * 10.06.97  : Minor update, bug fixes
  10.  */
  11.  
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <exec/types.h>
  17. #include <proto/dos.h>
  18. #include <dos/dos.h>
  19.  
  20. #define VERSION "1.2"
  21. const UBYTE Version[] = "$VER: makeman "VERSION" by MarkP (10.06.97)\n\n";
  22. BOOL checkFileName(char *fn)
  23. {
  24.     // see if its good enough
  25.     while(*fn)
  26.     {
  27.     if(*fn=='>' || *fn=='-' || *fn=='*' || *fn==0x27)
  28.         return(0);
  29.      fn++;
  30.     }
  31.  
  32.     return(1);
  33. }
  34.  
  35. int main(int argc, char *argv[])
  36. {
  37.     char buf[1024];
  38.     LONG numOfPages = 0;
  39.     LONG numOfDocs  = 0;
  40.     BPTR srcFile = NULL;
  41.     FILE *dstFile = NULL;
  42.     BPTR fileLock = NULL;
  43.     char ManPage[256];
  44.     char fullFileName[256];
  45.     struct FileInfoBlock *fileInfo = NULL;
  46.     register char *pos = NULL;
  47.     int InDoc = 0;
  48.     BPTR tmpLock = NULL;
  49.  
  50.     char SDir[256]; // The source directory, where the autodocs files are held(default is ADocs: )
  51.     char DDir[256]; // the destination dir for the man pages(default is ManDir: )
  52.  
  53.     if(argc==2)
  54.     {
  55.     if(argv[1][0]=='?')
  56.     {
  57.         printf("manmake version "VERSION" by MarkP(Mark Papadakis)\n");
  58.         printf("Create manpages from autodoc entries.\n");
  59.         printf("Usage : manmake [adocs dir] [manpages dir].\n");
  60.         printf("Defaults  -  adocs dir=ADocs: manpages dir=ManDir:\n");
  61.         printf("Read the docs for more info.\n");
  62.         exit(0);
  63.     }
  64.     }
  65.  
  66.     if(argc>=2)
  67.     strcpy(SDir,argv[1]);
  68.     else
  69.     strcpy(SDir, "ADocs:");
  70.     if(argc>=3)
  71.     strcpy(DDir, argv[2]);
  72.     else
  73.     strcpy(DDir, "ManDir:");
  74.  
  75.     // Append a '/' if necessary
  76.     {
  77.     int l = strlen(SDir);
  78.     if(SDir[l-1]!=':' && SDir[l-1]!='/')
  79.         strcat(SDir,"/");
  80.     l = strlen(DDir);
  81.     if(DDir[l-1]!=':' && DDir[l-1]!='/')
  82.         strcat(DDir,"/");
  83.     }
  84.  
  85.  
  86.     fileLock = Lock(SDir,ACCESS_READ);
  87.     if(!fileLock)
  88.     {
  89.     printf("Unable to access '%s'\n",SDir);
  90.     exit(1L);
  91.     }
  92.     if(!(fileInfo = AllocDosObject(DOS_FIB, NULL)))
  93.     {
  94.     UnLock(fileLock);
  95.     printf("Not enough mem(1)\n");
  96.     exit(1L);
  97.     }
  98.     Examine(fileLock, fileInfo);
  99.     while(ExNext(fileLock, fileInfo))
  100.     {
  101.     if(fileInfo -> fib_DirEntryType<=0) // file
  102.     {
  103.         sprintf(fullFileName,"%s%s", SDir,fileInfo -> fib_FileName);
  104.         if(fileInfo->fib_Size<=80)
  105.         {
  106.         printf("File \"%s\" is too small for an autodoc file.\n",fullFileName);
  107.         continue; 
  108.         }
  109.         // Access it now
  110.         if(!(srcFile = Open(fullFileName, MODE_OLDFILE)))
  111.         {
  112.         printf("Unable to access(read) file \"%s\".\n",fullFileName);
  113.         FreeDosObject(DOS_FIB, fileInfo);
  114.         UnLock(fileLock);
  115.         exit(1L);
  116.         }
  117.         printf("Processing %s..\n", fullFileName);
  118.         numOfDocs++;
  119.         // read it
  120.         while(FGets(srcFile, buf, 1023))
  121.         {
  122.         char fullName[256];
  123.         pos = buf;
  124.         if(!InDoc)
  125.         {
  126.         // we need something xxxx.library/function      xxxx.library/function
  127.         if(sscanf(pos, "%s", fullName)==1) //  && pos[1]>32)
  128.         {
  129.             pos+=strlen(fullName)+1;
  130.             if(strstr(pos,fullName) && strchr(fullName,'.')!=0 && strchr(fullName, '/')!=0 && checkFileName(fullName)==1)
  131.             {
  132.             // we found one
  133.             pos = fullName;
  134.             while(*pos!='/')
  135.                 pos++;
  136.             pos++;
  137.             sprintf(ManPage,"%s%s", DDir, pos);
  138.             tmpLock = Lock(ManPage, ACCESS_READ);
  139.             if(tmpLock)
  140.             {
  141.                 UnLock(tmpLock);
  142.                 tmpLock = NULL;
  143.                 continue;
  144.             }
  145.             InDoc = 1;
  146.             if(!(dstFile = fopen(ManPage,"w")))
  147.             {
  148.                 printf("Unable to access(write) file %s.\n", ManPage);
  149.                 Close(srcFile);
  150.                 FreeDosObject(DOS_FIB, fileInfo);
  151.                 UnLock(fileLock);
  152.                 exit(1L);
  153.             }
  154.             numOfPages++;
  155.             fprintf(dstFile, "From file : %s\n", fullFileName);  // write header
  156.             FGets(srcFile, buf, 1023);
  157.             }
  158.         }
  159.         pos = buf;
  160.         }// END (!InDoc)
  161.         pos = buf;
  162.  
  163.         if(InDoc)
  164.         {
  165.             // look for the special character
  166.             if(*pos==0x0C)
  167.             {
  168.             InDoc = 0;
  169.             fclose(dstFile);
  170.  
  171.             }
  172.            }// END InDoc
  173.            if(InDoc)
  174.            fprintf(dstFile,"%s", buf);
  175.         }
  176.         Close(srcFile);
  177.     }
  178.     }
  179.     FreeDosObject(DOS_FIB, fileInfo);
  180.     UnLock(fileLock);
  181.     printf("**ALL DONE**\n");
  182.     printf("%d documents searched, %ld man pages created.\n", numOfDocs, numOfPages);
  183. }
  184.